package fractal;
import java.util.ArrayList;
import java.util.List;

public class Determine implements Randomiseur
{
	protected int nbAppel;
	protected List<Double> _listValue;
	protected static int NBGEN = 60;

	public Determine(String pString)
	{
		// init tableau
		_listValue = new ArrayList<Double>();
		for (int i = 0; i < NBGEN; i++)
		{
			_listValue.add(-1.0);
		}

		char[] tab = pString.toCharArray();
		int ecart = NBGEN / tab.length;
		for (int i = 0; i < tab.length; i++)
		{
			// remplissage 1
			_listValue.add(ecart * i, (double) tab[i] / 100.0);
			int j = i + 1;
			if (j >= tab.length)
			{
				j = 0;
			}
			int mod2 = i % 2;
			// remplissage 2
			_listValue.add(ecart * i + 1 + mod2,
					Math.abs((double) tab[i] - (double) tab[j]) / 100.0);
			// remplissage 3
			_listValue.add(ecart * i + 2 - mod2,
					((double) tab[i] + (double) tab[j]) / 200.0);
			int mod3 = i % 3;
			// remplissage 4
			_listValue.add(ecart * i + 3 + mod3, (100 - (double) tab[i]) / 100.0);
			// remplissage 4
			_listValue.add(ecart * i + (4 + mod3 > 5 ? 3 : 4 + mod3) , (100 - _listValue.get(ecart * i + 2)) / 100.0);
			// remplissage 5
			_listValue.add(ecart * i + 5 - mod3, Math.abs(_listValue.get(ecart * i + 2) - _listValue.get(ecart * i + 3)));
		}
	}

	public void print() {
		int nbTotal = 0;
		for (int i = 0; i < 10; i++)
		{
			for (int j = 0; j < 10; j++)
			{
				nbTotal++;
				System.out.println(_listValue.get(nbTotal));
			}
		}

	}

	@Override
	public double random() {
		double value = _listValue.get(nbAppel%NBGEN);
		nbAppel++;
		return value;
	}
}
